#pragma once
#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<cstring>
#include<netinet/in.h>
#include<arpa/inet.h>
#define SIZE 128

#define DEFAULT 8081

class udp_sever
{
  private:
    int port;
    int sockfd;
  public:
    udp_sever(int _port=DEFAULT)
      :port(_port)
      ,sockfd(-1)
      {}
    //所有接口初始化
    bool initudp_sever()
    {
      //第一个参数 使用的协议AF_INET
      //type  服务类型，字节流，还是数据流
      //第三个参数  协议类别
      sockfd=socket(AF_INET,SOCK_DGRAM,0);
      if(sockfd<0)
      {
        std::cout<<"sockfd creat fail"<<std::endl;
        return false;
      }
      std::cout<<"sockfd creat success "<<sockfd<<std::endl;
      struct sockaddr_in local;

      //port需要转成网络端口      
      memset(&local,0,sizeof(local));
      local.sin_family=AF_INET;
      local.sin_port=htons(port);
      local.sin_addr.s_addr=INADDR_ANY;//接收任意ip发过来的消息
      //绑定
      if(bind(sockfd,(struct sockaddr*)&local,sizeof(local))<0)
      {
        std::cout<<"bind fail"<<std::endl;
        return false;
      }
      return true;
    }
    void start()
    {
      char buffer[SIZE];
      for(;;)
      {
        struct sockaddr_in perr;
        socklen_t len = sizeof(perr);
        ssize_t size=recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&perr,&len);
        if(size>0)
        {
          buffer[size]=0;
          int _port=ntohs(perr.sin_port);
          std::string _ip=inet_ntoa(perr.sin_addr);
          std::cout<<"port "<<_port<<buffer<<" ip "<<_ip<<std::endl;
        }
      }
    }
    ~udp_sever()
    {
      if(sockfd>0)
      {
        close(sockfd);
      }
    }
};

